//package com.my.getway.test;
//
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.cloud.gateway.filter.GatewayFilter;
//import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
//import org.springframework.http.HttpStatus;
//import org.springframework.http.server.reactive.ServerHttpRequest;
//import org.springframework.http.server.reactive.ServerHttpResponse;
//import org.springframework.stereotype.Component;
//
//import java.util.Objects;
//
///**
// * @author timo 2021/3/19
// */
//@Slf4j
//@Component
//public class AuthorizationFilter extends AbstractGatewayFilterFactory {
//
//    @Autowired
//    private Session session;
//
//    @Override
//    public GatewayFilter apply(Object config) {
//        return (exchange, chain) -> {
//
//            ServerHttpRequest request = exchange.getRequest();
//            ServerHttpResponse response = exchange.getResponse();
//
//            String uri = request.getURI().getPath();
//            String method = request.getMethodValue();
//
//            // 1.从AuthenticationFilter中获取userName
//            String key = "X-User-Name";
//            if (!request.getHeaders().containsKey(key)) {
//                response.setStatusCode(HttpStatus.FORBIDDEN);
//                return response.setComplete();
//            }
//
//            String userName = Objects.requireNonNull(request.getHeaders().get(key)).get(0);
//
//            // 2.验证权限
//            if (!session.checkPermissions(userName, uri, method)) {
//                log.info("用户：{}, 没有权限", userName);
//                response.setStatusCode(HttpStatus.FORBIDDEN);
//                return response.setComplete();
//            }
//
//            return chain.filter(exchange);
//        };
//    }
//
//
//}
//
//    public boolean checkPermissions(String userName, String uri, String method) {
//        String key = String.format("login:permission:%s", userName);
//        String hashKey = String.format("%s:%s", method, uri);
//
//        if (redisTemplate.opsForHash().hasKey(key, hashKey)){
//            return  true;
//        }
//
//        String allKey = "login:permission:all";
//        // 权限列表中没有则通过
//        return !redisTemplate.opsForHash().hasKey(allKey, hashKey);
//    }
//
//    权限列表中没有则通过 主要是放过一些没有必要配置的公共资源，默认都可以访问的资源
//        login:permission:all 所有配置过的权限列表需要在程序启动时放入缓存，并需要保持数据的更新
